package com.tangruojie.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.CorsConfigurationSource;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;

import java.util.List;

/**
 * 跨域配置
 */
@Configuration
public class CorsConfig {

    /**
     * 内部逻辑：
     * Spring Security 检查是否有 CorsConfigurationSource Bean；
     * 如果有，就用它；
     * 如果没有，就尝试用 WebMvcConfigurer 中的跨域配置；
     * 然后在 Security 过滤器链中插入一个 CorsFilter。
     * 这样，CORS 策略会在 Security 过滤器层生效，从而避免请求还没到 MVC 就被拦下。
     */

    /**
     * Spring Security 跨域配置源
     *
     * @return
     */
    @Bean
    public CorsConfigurationSource corsConfigurationSource() {
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.setAllowedOrigins(List.of("*")); // 允许的源
        corsConfiguration.setAllowedMethods(List.of("GET", "POST", "PUT", "DELETE", "OPTIONS")); // 允许的跨域访问的方法
        corsConfiguration.setAllowedHeaders(List.of("*")); // 允许的跨域访问的请求头
        /**
         * JWT 走 请求头 → allowCredentials(false)（推荐）
         * JWT 走 Cookie → allowCredentials(true) 并精确配置域名与前端 withCredentials 设置。
         */
        corsConfiguration.setAllowCredentials(false); // 允许跨域访问的凭证
        corsConfiguration.setMaxAge(3600L); // 允许跨域访问的缓存时间
        UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
        urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration);
        return urlBasedCorsConfigurationSource;
    }

}
